#include <cstdlib>
#include <iostream>
#include<sstream>
#include <string>
#include<vector>
#include<map>
#include "Fraction.cpp"
#include "combination.cpp"

using namespace std;
#include "MathObject.cpp"
#include "GenericPermutation.cpp"
#include "GenericCombination.cpp"
#include "symmetricpolynomial.cpp"
#include "polynomial.cpp"
#include "algorithm.cpp"

//Testing templates
template<typename T>
class algorithm_selector{
      public:
      static void print(){
             cout<<"Generico."<<endl;
      }
};

template<>
class algorithm_selector<int>{
      public:
      static void print(){
             cout<<"Integer."<<endl;
      }
};
//Testing the symmetric polynomail class
int main(int argc, char *argv[])
{
    std::vector<std::string> vars;
    vars.push_back("x");
    vars.push_back("y");
    vars.push_back("z");
    std::vector<int> degree;
    degree.push_back(0);
    degree.push_back(0);
    degree.push_back(1);
    symmetricpolynomial<int> sp(degree,vars,1);
    cout<<"Starting with "<<sp<<endl;
    //symmetricpolynomial<int> temp(sp);
    //symmetricpolynomial<int> res=sp-temp;
    //cout<<sp<<" - "<<temp<<" = "<<res<<endl;
    //cout<<sp.lcoeff()<<endl;
    cout<<"This results in ";
    polynomial<int> r = elementary_symmetric_decomposition<int>(sp);
    cout<<r<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}
